
/*
  HOJA DE TRABAJO 6
ListCircular.java
Fecha: 2 de Septiembre de 2011
Autor: Claudia Grajeda
Descripcion:


*/

/**
 * @author Claudia Grajeda
 *
 */
import java.util.*;


public class Ventanillas<T> extends Abstracta<T>{

	private Queue<T> cola1 = new LinkedList<T>();	     // la cola 1
	private Queue<T> cola2 = new LinkedList<T>();		// cola 2
	private Queue<T> cola3 = new LinkedList<T>();		//cola 3
	private Queue<T> cola4 = new LinkedList<T>();		//cola 4
	private Random num = new Random();
	private T cliente, cliente2;
	Object cliente3;
	int ent, ent2, esp1, esp2, esp3, num1, num2, num3, num4, num5;
	Object[] a;
	
	
	
	
	/**
	 *Listcircular: constructor, inicializa las variables
	 */
	public Ventanillas(){
		super();
		a= new Object[10];
	}

	@Override
	public T element() {
		
		return null;
	}



	@Override
	public boolean empty() {
		
		return false;
	}
	

	@Override
	public T remove(T p) {
		if (cola1.peek() == p){
			cliente2 = cola1.remove();
		}
		else{
			if (cola2.peek() == p){
				cliente2 = cola2.remove();
			}
			else{
				if (cola3.peek() == p){
					cliente2 = cola3.remove();
				}
				else{
					if (cola4.peek() == p){
						cliente2 = cola4.remove();
					}
				}
			}
		}
		return cliente2;
	}

	

	public void add(T e) {
		cliente = e;
		if (cola1.size() <= cola2.size()){
			if (cola1.size() <= cola3.size()){
				if (cola1.size() <= cola4.size()){
					if (cola1.size() < 10){
						if (cola1.isEmpty() == false){
							cola1.toArray(a);
							esp1 = ((Cliente) a[cola1.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola1.add(e);
					}
				}
				else{
					if (cola4.size() < 10){
						if (cola4.isEmpty() == false){
							cola4.toArray(a);
							esp1 = ((Cliente) a[cola4.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola4.add(e);
						
					}
				}
			}
			else{
				if (cola3.size() <= cola4.size()){
					if (cola3.size() < 10){
						if (cola3.isEmpty() == false){
							cola3.toArray(a);
							esp1 = ((Cliente) a[cola3.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola3.add(e);
						
					}
						
				}
				else{
					if (cola4.size() < 10){
						if (cola4.isEmpty() == false){
							cola4.toArray(a);
							esp1 = ((Cliente) a[cola4.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola4.add(e);
					}
				}
			}
		}
		else {
			if (cola2.size() <= cola3.size()){
				if (cola2.size() <= cola4.size()){
					if (cola2.size() < 10){
						if (cola2.isEmpty() == false){
							cola2.toArray(a);
							esp1 = ((Cliente) a[cola2.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola2.add(e);
						
					}
				}
				else{
					if (cola4.size() < 10){
						if (cola4.isEmpty() == false){
							cola4.toArray(a);
							esp1 = ((Cliente) a[cola4.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola4.add(e);
						
					}
				}
			}
			else{
				if (cola3.size() <= cola4.size()){
					if (cola3.size() < 10){
						if (cola3.isEmpty() == false){
							cola3.toArray(a);
							esp1 = ((Cliente) a[cola3.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola3.add(e);
						
					}
				}
				else{
					if (cola4.size() < 10){
						if (cola4.isEmpty() == false){
							cola4.toArray(a);
							esp1 = ((Cliente) a[cola4.size()-1]).getSal();						
							esp2 = ((Cliente) e).getEntrada();
							esp3 = esp1-esp2;	
						}
						((Cliente) e).setEspera(esp3);
						cola4.add(e);
						
					}
				}
			}
		}
	}
	
	
	
	
	
	public void setTransaccion(){
		num1 = num.nextInt(480) + 1 ;
		if ((((Cliente) cola1.peek()).getTrans() == 0) && ( cola1.isEmpty() == false)){
			cliente = cola1.peek();
		}
		else{
			if ((((Cliente) cola2.peek()).getTrans() == 0) && (cola2.isEmpty() == false)){
				cliente = cola2.peek();
			}
			else{
				if ((((Cliente) cola3.peek()).getTrans() == 0) && (cola3.isEmpty())==false){
					cliente = cola3.peek();
				}
				else{
					if ((((Cliente) cola4.peek()).getTrans() == 0) && (cola4.isEmpty() == false)){
						cliente = cola4.peek();
					}
				}
			}
		}
		
		if (((Cliente) cliente).getTrans() == 0){
			((Cliente) cliente).setTrans(num1);
			((Cliente) cliente).setEvento();
			num3 = ((Cliente) cliente).getEntrada();
			num4 = ((Cliente) cliente).getTrans();
			num5 = ((Cliente) cliente).getEspera();
			num2 = num3 + num4 + num5;
			((Cliente) cliente).setSal(num2);
		}		
		
	}
	
	public T[] ordenar(T data[], int n){
		int numSorted = 1; // number of values in place
		int index; // general index
		while (numSorted <  n){
			// take the first unsorted value
			T temp = data[numSorted];
			// ...and insert it among the sorted:
			for (index = numSorted; index > 0; index--){
				if (((Cliente) temp).getEvento()){
					ent = ((Cliente) temp).getEntrada();
				}
				else{
					ent = ((Cliente) temp).getSal();
				}
				
				if (((Cliente) data[index-1]).getEvento()){
					ent2 = ((Cliente) temp).getEntrada();
				}
				else{
					ent2 = ((Cliente) data[index-1]).getSal();
				}
					
				if (ent < ent2){
					data[index] = data[index-1];
				} else {
					break;
				}
			}
			// reinsert value
			data[index] = temp;
			numSorted++;
		}
		return (T[]) data;
	}
	
	public String toString(){
		String descripcion = "";
		descripcion += "\n Cola 1: \n" ;
		descripcion += cola1.toString();	
		descripcion += "\n Cola 2: \n" ;
		descripcion += cola2.toString();
		descripcion += "\n Cola 3: \n" ;
		descripcion += cola3.toString();
		descripcion += "\n Cola 4: \n" ;
		descripcion += cola4.toString();
		return descripcion;
	}

	
	

	
}
